﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DECOR.DL.DALC.SAPC.Proxy;
using System.Data;
using DECOR.BL.BE;

namespace DECOR.DL.DALC.SAPC
{
    public class ClienteDALC : IClienteDALC
    {        
       public static ClienteDALC Instance() {
            if (_instance == null)
            {
                lock (typeof(ClienteDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new ClienteDALC();
                    }
                }
            }
            return _instance;
        }
       private ClienteDALC() { }
       private static volatile ClienteDALC _instance = null;      
   

        #region IClienteDALC Members

        /// <summary>
        /// Devuelve una lista de clientes segun el parametro.
        /// </summary>
        /// <param name="pNombre">Nombre o parte del nombre de un cliente.</param>
        /// <returns>Devuelve lista de clientes</returns> 
        public List<ClienteBE> buscar(string pNombre)
        {
            ClientesProxy proxy = new ClientesProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            /* llamando a la función */
            string ex_result = "";
            KNA1Table tblResult = new KNA1Table();
            proxy.Zweb_Busca_Clientes(pNombre, out ex_result, ref tblResult);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            /* Manejando el retorno */
            DataTable dt = tblResult.ToADODataTable();

            List<ClienteBE> listaResult = new List<ClienteBE>();
            foreach (DataRow dr in dt.Rows)
            {
                ClienteBE obj = new ClienteBE();
                obj.Codigo = dr["KUNNR"].ToString();
                obj.Descripcion = dr["NAME1"].ToString().Trim() + (dr["NAME2"].ToString().Trim().Equals("") ? "" : " " + dr["NAME2"].ToString());
                obj.Ruc = dr["STCD1"].ToString();
                listaResult.Add(obj);
            }
            return listaResult;
        }


        /// <summary>
        /// retorna la información del cliente
        /// </summary>
        /// <param name="pCodigo">Código del cliente</param>
        /// <returns>Devuelve los datos del cliente</returns>
        public ClienteBE leer(string pCodigo)
        {
            ClientesProxy proxy = new ClientesProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            /* llamando a la función */
            string ex_result = "", ex_eventual = "";
            ZWEB_INTERLOCUTORESTable tblResult = new ZWEB_INTERLOCUTORESTable();
            proxy.Zweb_Lee_Cliente(pCodigo, out ex_eventual, out ex_result, ref tblResult);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            /* Manejando el retorno */
            DataTable dt = tblResult.ToADODataTable();

            ClienteBE obj = null;
            ZWEB_INTERLOCUTORES item;
            if (tblResult.Count == 1)
            {
                item = tblResult[0];
                obj = new ClienteBE();

                obj.Codigo = item.Kunnr;
                obj.Ruc = item.Stcd1;
                obj.Descripcion = item.Nombre;
                obj.Ciudad = item.City;
                obj.Direccion = item.Street;
                obj.CodigoPostal = item.Postl_Code;
                obj.Telefono = item.Telephone;
                obj.Mail = item.E_Mail;
                

                obj.Eventual = ex_eventual == "X" ? true : false;
            }
            else { return null; }
            return obj;
        }

        /// <summary>
        /// devuelve la lista de organizaciones de venta
        /// </summary>
        /// <param name="pCodCliente">Código del cliente</param>
        /// <returns>Lista de organizaciones de venta</returns>
        public List<GenericBE> listaOrgVtas(string pCodCliente)
        {
            OrgVentasProxy proxy = new OrgVentasProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            TVKOTTable t_tvkot = new TVKOTTable();
            proxy.Zweb_Lista_Orgvtas(pCodCliente, ref t_tvkot);

            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            List<GenericBE> lstOrgVtas = new List<GenericBE>();
            DataTable dt = t_tvkot.ToADODataTable();
            foreach (DataRow dr in dt.Rows)
            {
                GenericBE obj = new GenericBE();
                obj.Codigo = dr["VKORG"].ToString();
                obj.Descripcion = dr["VKORG"].ToString() + " :: " + dr["VTEXT"].ToString();
                lstOrgVtas.Add(obj);
            }
            return lstOrgVtas;
        }

        /// <summary>
        /// devuelve la lista de canales de distribución por codigo del cliente y organizacion de ventas
        /// </summary>
        /// <param name="pCodCliente">Código del cliente</param>
        /// <param name="pCodOrgVtas">Código Organización de ventas</param>
        /// <returns>Lista de canales de distribucion</returns>
        public List<GenericBE> listaCanalDist(string pCodCliente, string pCodOrgVtas)
        {
            CanalesDistProxy proxy = new CanalesDistProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            TVTWTTable t_tvtwt = new TVTWTTable();
            proxy.Zweb_Lista_Canaldist(pCodCliente, pCodOrgVtas, ref t_tvtwt);
            //-----------------
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            //-----------------
            List<GenericBE> lstCanalesDist = new List<GenericBE>();
            DataTable dt = t_tvtwt.ToADODataTable();
            foreach (DataRow dr in dt.Rows)
            {
                GenericBE obj = new GenericBE();
                obj.Codigo = dr["VTWEG"].ToString();
                obj.Descripcion = dr["VTWEG"].ToString() + " :: " + dr["VTEXT"].ToString();
                lstCanalesDist.Add(obj);
            }
            return lstCanalesDist;
        }

        public List<GenericBE> listaSectores()
        {
            SectoresProxy proxy = new SectoresProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            TSPATTable T_TSPAT = new TSPATTable();
            proxy.Zweb_Lista_Sectores(ref T_TSPAT);
            //-----------------
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            //-----------------
            List<GenericBE> lst = new List<GenericBE>();
            DataTable dt = T_TSPAT.ToADODataTable();
            foreach (DataRow dr in dt.Rows)
            {
                GenericBE obj = new GenericBE();
                obj.Codigo = dr["SPART"].ToString();
                obj.Descripcion = dr["SPART"].ToString() + " :: " + dr["VTEXT"].ToString();
                lst.Add(obj);
            }
            return lst;
        }

        /// <summary>
        /// Retorna los datos del vendedor asignado en la tabla KNVP
        /// </summary>
        /// <param name="pCodCliente">Código del cliente.</param>
        /// <param name="pCodOrgVtas">Código de organización de ventas.</param>
        /// <param name="pCodCanalDist">Código de canal de distribución.</param>
        /// <returns >Devuelve la clase PersonaBE con los datos del vendedor</returns>       
        public PersonaBE buscaVendedor(string pCodCliente, string pCodOrgVtas, string pCodCanalDist)
        {
            ClientesProxy proxy = new ClientesProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            PA0002Table t_pa0002 = new PA0002Table();
            proxy.Zweb_Busca_Vendedor(pCodCliente, pCodOrgVtas, pCodCanalDist, ref t_pa0002);
            //-----------------
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            //-----------------
            PersonaBE objPersona = null;
            DataTable dt = t_pa0002.ToADODataTable();
            if (dt.Rows.Count == 1)
            {
                DataRow dr = dt.Rows[0];
                objPersona = new PersonaBE();
                objPersona.CodPersona = dr["PERNR"].ToString();
                objPersona.Nombre = dr["VORNA"].ToString();
                objPersona.Apellido = dr["NACHN"].ToString();
                objPersona.ApeSoltero = dr["NAME2"].ToString();
                objPersona.Iniciales = dr["INITS"].ToString();
                objPersona.Descripcion = (dr["VORNA"].ToString() + " " + dr["NACHN"].ToString() + " " + dr["NAME2"].ToString()).Trim();
            }
            return objPersona;
        }


        /// <summary>
        /// Busca Condicion Pago y Expedicion
        /// </summary>
        /// <param name="pCodCliente">Código de cliente.</param>
        /// <param name="pCodOrgVtas">Código de Organización de ventas.</param>
        /// <param name="pCodCanalDist">Código de Canal de distribución.</param>
        /// <param name="pCodSector">Código de sector.</param>
        /// <param name="pCondPago">Valor de retorno: Clave de condiciones de pago.</param>
        /// <param name="pCondExp">Valor de retorno: Condición de expedición.</param>  
        public void infoClienteNac(string pCodCliente, string pCodOrgVtas, string pCodCanalDist, string pCodSector, 
                                   out string pCondPago, out string pCondExp)
        {
            pCondExp = ""; pCondPago = "";
            ClientesProxy proxy = new ClientesProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            proxy.Zweb_Busca_Condiciones(pCodCliente, pCodSector, pCodOrgVtas, pCodCanalDist, out pCondExp, out pCondPago);
            //-----------------
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
        }

        public string validaInterlocutor(ref ClienteBE pClienteBE, string pCodOrgVtas, string pCodCanalDist, string pCodSector)
        {
            ClientesProxy proxy = new ClientesProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            string ex_result = "";
            ZWEB_INTERLOCUTORESTable t_inter = new ZWEB_INTERLOCUTORESTable();
            proxy.Zweb_Valida_Interlocutores(pClienteBE.Codigo, pCodSector, pCodOrgVtas, pCodCanalDist, out ex_result, ref t_inter);
            //-----------------
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            
            if (t_inter.Count >= 1)
            {
                pClienteBE = (new ClienteDALC()).leer(pClienteBE.Codigo);
            }
            return ex_result;
        }

        public string validaRUC(string pRuc, string pOrgVtas)
        {
            ClientesProxy proxy = new ClientesProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            //-----------------
            string ex_result = "";
            proxy.Zweb_Validar_Ruc(pOrgVtas, pRuc, out ex_result);
            //-----------------
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            return ex_result;
        }

        #endregion

        #region IClienteDALC Members


        public List<ClienteBE> busquedaCliente(string pNombre, string pIdentifFiscal, string pNumeroDeudor)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Miembros de IClienteDALC


        public ClienteBE busquedaClienteReniec(string pNumDoc, string pNombre, string pApePat, string pApeMat, out string retval)
        {
            throw new NotImplementedException();
        }

        public void insertClienteReniec(ClienteBE objCliente, out string result)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Miembros de IClienteDALC


        public List<GenericBE> ListarGradoInstruccion()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Miembros de IClienteDALC


        public List<ClientePreResBE> ListaPreguntas()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Miembros de IClienteDALC


        public void insertClientePregRep(List<ClienteBE> listCliente)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Miembros de IClienteDALC


        public List<ClienteBE> busquedaClientePregRep(string numDoc)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
